草庐IT

Java Swingworker 和多线程

全部标签

java - 同步块(synchronized block)中的更改何时对其他线程可见

假设我在同步方法中更新了两个变量的值。在退出同步块(synchronizedblock)之前是否有可能在同步方法中设置的新值对其他线程可见?publicsynchronizedvoidsetValues(){a=5;//assumethreadispreemptedafterthisassignment//wouldthevalue5bevisibletootherthreads?//myunderstandingisthatthevalueswillnotbeflushedto//mainmemoryuntilthelockisreleased-i.e.,untilthesynchr

java - 为什么 Java 看不到来自另一个线程的更新值?

请看这段代码(摘自《EffectiveJava》一书)importjava.util.concurrent.TimeUnit;publicclassMain{privatestaticbooleanstopReq;publicstaticvoidmain(String[]args)throwsInterruptedException{Threadbgw=newThread(newRunnable(){publicvoidrun(){inti=0;while(!stopReq){i++;}}});bgw.start();TimeUnit.SECONDS.sleep(1);stopReq=

java - Mac#doFinal() 在 Java 中是线程安全的吗?

在java中,我们需要为太多的文本数据生成HmacSHA1/256消息摘要,当然还要并行。现在的问题是,javax.crypto.Mac#doFinal(byte[]:arg)是线程安全的,还是通过sun/oracle(hotspot)实现SPI更好?所有的盐键都是相同的,我正在考虑准备一个Macobj,所有线程都会调用它来生成消息摘要。我无法用javadoc来理解和表述它.如果这个人不是线程安全的,是否有任何等效项(可能来自Apache,...)?谢谢。 最佳答案 javax.crypto.Mac#doFinal方法都不是线程安全

java - 如何确保该方法仅从一个线程执行一次?

我有一个下面的方法,我想在下面的条件下执行:这个方法应该只执行一次。一旦执行,就无法再次执行,因此如果有人试图再次执行,它应该通过记录一些有用的错误消息alreadyexecuted或任何有用的信息返回。而且它应该只由一个线程执行。那么如果多个线程都在调用下面的方法,那么它应该只被一个线程调用,其他线程应该等待初始化完成?下面是我的方法:publicvoidinitialize(){Listmetadata=getMetadata(true);Listprocess=getProcess();if(!metadata.isEmpty()&&!process.isEmpty()){Man

java - JVM 消耗所有 CPU,大多数线程被阻塞。 JVM 错误?

昨晚,一台服务器(JBoss5.1GA,Java(TM)SERuntimeEnvironment(build1.6.0_20-b02),JavaHotSpot(TM)64位服务器VM,在VMWare上的LinuxVM中运行)突然开始使用100%CPU。该应用程序是运行Seam的相当典型的J2EE业务应用程序,没有什么特别之处。当时负载极低。我设法在进程被终止并重新启动之前获得线程转储(应用程序必须可用)。JStack在其死锁检测中出现异常;除此之外,大多数线程都处于阻塞状态。这是JVM错误吗?我以前没见过。重新启动后一切正常,就像在该服务器上使用该应用程序后的几个月(定期更新)。感谢您

Java多线程系列——JDK并发包

Java并发编程是Java开发中不可或缺的一部分,它允许开发者编写能够同时执行多个任务的应用程序,提高了程序的执行效率和响应速度。自从Java5开始,java.util.concurrent包成为了并发编程的核心,引入了多种并发工具类,使得并发程序的编写变得更加简单和高效。本文将深入探讨这个包中的各种并发工具及其用途。 Executor框架Executor框架是java.util.concurrent包的基石,提供了管理线程池的机制,允许开发者分离任务的提交与任务的执行过程。Executor接口:定义了一个执行提交任务的简单接口,主要方法为execute(Runnablecommand)。Ex

java - Java 8 并行流是否对序列使用相同的线程

假设我们有这样的东西:LongStream.range(0,10).parallel().filter(l->{System.out.format("filter:%s[%s]\n",l,Thread.currentThread().getName());returnl%2==0;}).map(l->{System.out.format("map:%s[%s]\n",l,Thread.currentThread().getName());returnl;});如果你运行这个程序输出会是这样的:filter:6[main]map:6[main]filter:5[main]filter:4

Java - 不可变数组线程安全

我有一个关于Java内存模型的问题。这是一个简单的类来展示问题:publicclassImmutableIntArray{privatefinalint[]array;publicImmutableIntArray(){array=newint[10];for(inti=0;i据我所知,JMM保证final字段的值在构造后对其他线程可见。但我想确保其他线程在构造后将看到存储在数组中的最新版本的数据。当然上面的代码只是一个简单的例子,实际上我想为直接字节缓冲区实现一个简单的缓存,我不想依赖一些Collection类。目前我正在使用ReentrantReadWriteLock来确保正确的行

java - 可以运行的 swing 工作线程的最大数量是多少

可运行的SwingWorker线程数是否有上限,或者内存支持多少?这也可以在某处配置吗? 最佳答案 SwingWorker本身不是线程,而是将在线程中执行的任务。通常,您会使用ExecutorService来执行SwingWorker的实例;此接口(interface)还允许设置线程数:intn=20;//MaximumnumberofthreadsExecutorServicethreadPool=Executors.newFixedThreadPool(n);SwingWorkerw;//don'tforgettoinitial

java - 如何确保一个方法只被多个线程调用一次?

我有以下结构:publicvoidsomeMethod(){//DOSOMESTUFFtry{doSomeProcessing();}catch(Exceptione){loadSomeHeavyData();doSomeProcessing();}}someMethod方法可能被多个线程并发调用。doSomeProcessing可能抛出异常(它在后端使用了一些可能过时的数据)。如果抛出异常,则loadSomeHeavyData();会执行一些耗时的任务,比如说“更新”所有当前数据,然后我可以调用doSomeProcessing();。问题:如何确保loadSomeHeavyData(